package com.by.common.controller;

import com.by.common.bean.ResultBean;
import com.by.common.ex.BusinessException;
import com.by.common.ex.ValidateException;
import org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.sql.SQLSyntaxErrorException;

/**
 * @author Ye QS
 * @version 0.1
 * @className GlobalExceptionController
 * @description
 * @date 2024/9/5 17:07
 * @since jdk11
 */
// 定义一个全局异常处理类，使用@RestControllerAdvice注解表示这是一个控制器增强类，用于全局异常处理
// 继承BaseController可能是为了复用一些通用的处理方法或属性
@RestControllerAdvice
public class GlobalExceptionController extends BaseController {
    @Value("${spring.servlet.multipart.max-file-size}")
    long maxFileSize;

    // 使用@ExceptionHandler注解来指定处理特定异常的方法
    // 当程序抛出ValidateException异常时，会调用此方法处理
    @ExceptionHandler(ValidateException.class)
    public ResultBean handlerValidatException(ValidateException e) {
        // 调用fail方法返回一个ResultBean对象，表示操作失败
        // 参数"验证失败"是错误提示信息，e.getErrors()是异常中的错误信息列表
        e.printStackTrace();
        return fail("验证失败", e.getErrors());
    }

    // 另一个异常处理方法，用于处理SQLSyntaxErrorException异常
    @ExceptionHandler(SQLSyntaxErrorException.class)
    public ResultBean handlerSQLSyntaxErrorException(SQLSyntaxErrorException e) {
        // 调用fail方法返回一个ResultBean对象，表示操作失败
        // 参数"sgl语法错误，请联系攻城师！"是错误提示信息，e.getErrorCode()是异常中的错误码
        // 注意：这里的"sgl语法错误"可能是个笔误，一般应该是"SQL语法错误"
        e.printStackTrace();
        return fail("sgl语法错误，请联系攻城师！", e.getErrorCode());
    }

    @ExceptionHandler(BusinessException.class)
    public ResultBean handlerBusinessException(BusinessException e) {
        e.printStackTrace();
        return fail(e.getMessage());
    }


    /**
     * 处理文件大小限制异常
     * 当上传文件的大小超过设定的最大值时，会调用此方法处理异常
     *
     * @param e 文件大小限制异常对象，包含了超过限制的具体信息
     * @return 返回一个结果对象，其中包含错误信息说明文件大小超过允许的最大值
     */
    @ExceptionHandler(FileSizeLimitExceededException.class)
    public ResultBean handlerFileSizeLimitExceededException(FileSizeLimitExceededException e) {
        // 计算最大允许文件大小，转换为MB单位，以便在错误消息中使用
        long size = maxFileSize / 1024 / 1024;
        // 返回一个表示失败的结果对象，携带具体错误信息
        return fail("文件大小不能超过" + size + "M");
    }
}
